#!/bin/bash

# Portainer 安装脚本 - CentOS 7.6
# 作者: Auto Generated
# 日期: $(date +%Y-%m-%d)
# 描述: 自动安装和配置 Portainer Docker 管理界面

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 配置变量
PORTAINER_VERSION="2.19.4"
PORTAINER_PORT="9000"
PORTAINER_AGENT_PORT="9001"
PORTAINER_DATA_DIR="/opt/portainer/data"
DOCKER_COMPOSE_VERSION="2.21.0"

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 检查是否为root用户
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "此脚本需要root权限运行"
        exit 1
    fi
}

# 检查系统版本
check_system() {
    log_step "检查系统版本..."
    if [[ ! -f /etc/redhat-release ]]; then
        log_error "此脚本仅支持 CentOS/RHEL 系统"
        exit 1
    fi
    
    local version=$(cat /etc/redhat-release)
    log_info "系统版本: $version"
    
    if ! echo "$version" | grep -q "CentOS.*7"; then
        log_warn "此脚本专为 CentOS 7.6 设计，其他版本可能存在兼容性问题"
    fi
}

# 更新系统
update_system() {
    log_step "更新系统包..."
    yum update -y
    yum install -y wget curl git yum-utils device-mapper-persistent-data lvm2
}

# 安装 Docker
install_docker() {
    log_step "安装 Docker..."
    
    if ! command -v docker &> /dev/null; then
        # 添加 Docker 官方仓库
        yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
        
        # 安装 Docker CE
        yum install -y docker-ce docker-ce-cli containerd.io
        
        # 启动并启用 Docker 服务
        systemctl start docker
        systemctl enable docker
        
        # 添加当前用户到 docker 组（如果不是 root）
        if [[ $SUDO_USER ]]; then
            usermod -aG docker $SUDO_USER
            log_info "用户 $SUDO_USER 已添加到 docker 组"
        fi
        
        log_info "Docker 安装完成"
    else
        log_info "Docker 已安装"
        systemctl start docker
        systemctl enable docker
    fi
    
    # 验证 Docker 安装
    docker --version
}

# 安装 Docker Compose
install_docker_compose() {
    log_step "安装 Docker Compose..."
    
    if ! command -v docker-compose &> /dev/null; then
        # 下载 Docker Compose
        curl -L "https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
        
        # 添加执行权限
        chmod +x /usr/local/bin/docker-compose
        
        # 创建软链接
        ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
        
        log_info "Docker Compose 安装完成"
    else
        log_info "Docker Compose 已安装"
    fi
    
    # 验证安装
    docker-compose --version
}

# 创建数据目录
create_directories() {
    log_step "创建 Portainer 数据目录..."
    
    mkdir -p "$PORTAINER_DATA_DIR"
    chmod 755 "$PORTAINER_DATA_DIR"
    
    log_info "数据目录创建完成: $PORTAINER_DATA_DIR"
}

# 配置防火墙
configure_firewall() {
    log_step "配置防火墙..."
    
    if systemctl is-active --quiet firewalld; then
        firewall-cmd --permanent --add-port=$PORTAINER_PORT/tcp
        firewall-cmd --permanent --add-port=$PORTAINER_AGENT_PORT/tcp
        firewall-cmd --permanent --add-service=ssh
        firewall-cmd --reload
        log_info "防火墙配置完成"
    else
        log_warn "firewalld 未运行，跳过防火墙配置"
    fi
}

# 创建 Docker Compose 文件
create_docker_compose() {
    log_step "创建 Docker Compose 配置文件..."
    
    cat > /opt/portainer/docker-compose.yml << EOF
version: '3.8'

services:
  portainer:
    image: portainer/portainer-ce:${PORTAINER_VERSION}
    container_name: portainer
    restart: unless-stopped
    ports:
      - "${PORTAINER_PORT}:9000"
      - "${PORTAINER_AGENT_PORT}:9001"
    volumes:
      - ${PORTAINER_DATA_DIR}:/data
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - PORTAINER_ADMIN_PASSWORD_FILE=/data/admin_password
    command: --admin-password-file /data/admin_password
    networks:
      - portainer_network

networks:
  portainer_network:
    driver: bridge
EOF

    log_info "Docker Compose 配置文件创建完成"
}

# 创建管理员密码
create_admin_password() {
    log_step "设置 Portainer 管理员密码..."
    
    # 生成随机密码或使用默认密码
    local admin_password="admin123456"
    
    # 创建密码哈希
    echo -n "$admin_password" | docker run --rm -i portainer/helper-reset-password > "$PORTAINER_DATA_DIR/admin_password"
    
    log_info "管理员密码已设置"
    log_warn "默认管理员账户: admin"
    log_warn "默认管理员密码: $admin_password"
    log_warn "请在首次登录后立即修改密码！"
}

# 启动 Portainer
start_portainer() {
    log_step "启动 Portainer..."
    
    cd /opt/portainer
    
    # 拉取镜像
    docker-compose pull
    
    # 启动服务
    docker-compose up -d
    
    # 等待服务启动
    sleep 10
    
    # 检查服务状态
    if docker-compose ps | grep -q "Up"; then
        log_info "Portainer 启动成功"
    else
        log_error "Portainer 启动失败"
        docker-compose logs
        exit 1
    fi
}

# 创建系统服务
create_systemd_service() {
    log_step "创建 systemd 服务..."
    
    cat > /etc/systemd/system/portainer.service << EOF
[Unit]
Description=Portainer Docker Management
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/portainer
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target
EOF

    systemctl daemon-reload
    systemctl enable portainer
    
    log_info "systemd 服务创建完成"
}

# 创建管理脚本
create_management_scripts() {
    log_step "创建管理脚本..."
    
    # 创建启动脚本
    cat > /usr/local/bin/portainer-start << 'EOF'
#!/bin/bash
cd /opt/portainer
docker-compose up -d
echo "Portainer 已启动"
EOF

    # 创建停止脚本
    cat > /usr/local/bin/portainer-stop << 'EOF'
#!/bin/bash
cd /opt/portainer
docker-compose down
echo "Portainer 已停止"
EOF

    # 创建重启脚本
    cat > /usr/local/bin/portainer-restart << 'EOF'
#!/bin/bash
cd /opt/portainer
docker-compose restart
echo "Portainer 已重启"
EOF

    # 创建状态查看脚本
    cat > /usr/local/bin/portainer-status << 'EOF'
#!/bin/bash
cd /opt/portainer
docker-compose ps
EOF

    # 创建日志查看脚本
    cat > /usr/local/bin/portainer-logs << 'EOF'
#!/bin/bash
cd /opt/portainer
docker-compose logs -f
EOF

    # 添加执行权限
    chmod +x /usr/local/bin/portainer-*
    
    log_info "管理脚本创建完成"
}

# 显示安装信息
show_info() {
    log_step "安装完成！"
    echo
    log_info "Portainer 安装信息:"
    echo "  - 访问地址: http://$(hostname -I | awk '{print $1}'):$PORTAINER_PORT"
    echo "  - 管理员用户: admin"
    echo "  - 管理员密码: admin123456 (请立即修改)"
    echo "  - 数据目录: $PORTAINER_DATA_DIR"
    echo "  - 配置文件: /opt/portainer/docker-compose.yml"
    echo
    log_info "管理命令:"
    echo "  - 启动服务: portainer-start 或 systemctl start portainer"
    echo "  - 停止服务: portainer-stop 或 systemctl stop portainer"
    echo "  - 重启服务: portainer-restart 或 systemctl restart portainer"
    echo "  - 查看状态: portainer-status"
    echo "  - 查看日志: portainer-logs"
    echo
    log_info "Docker 管理:"
    echo "  - 查看容器: docker ps"
    echo "  - 查看镜像: docker images"
    echo "  - 清理系统: docker system prune"
    echo
    log_warn "安全提醒:"
    echo "  1. 请立即登录 Portainer 修改默认密码"
    echo "  2. 建议配置 HTTPS 访问"
    echo "  3. 定期备份 $PORTAINER_DATA_DIR 目录"
    echo "  4. 监控系统资源使用情况"
}

# 主函数
main() {
    log_info "开始安装 Portainer $PORTAINER_VERSION on CentOS 7.6"
    echo
    
    check_root
    check_system
    update_system
    install_docker
    install_docker_compose
    create_directories
    configure_firewall
    create_docker_compose
    create_admin_password
    start_portainer
    create_systemd_service
    create_management_scripts
    show_info
    
    log_info "Portainer 安装完成！"
}

# 执行主函数
main "$@"
